package com.hadoop.mapreduce.Partitioner;

import entity.UserEntity;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/*
 * 继承Mapper类需要定义四个输出、输出类型泛型：
 * 四个泛型类型分别代表：
 * KeyIn        Mapper的输入数据的Key，这里是每行文字的起始位置（0,11,...） 游标
 * ValueIn      Mapper的输入数据的Value，这里是每行文字
 * KeyOut       Mapper的输出数据的Key，这里可以不返回任何值
 * ValueOut     Mapper的输出数据的Value，这里是序列化对象UserEntity
 *
 * Writable接口是一个实现了序列化协议的序列化对象。
 * 在Hadoop中定义一个结构化对象都要实现Writable接口，使得该结构化对象可以序列化为字节流，字节流也可以反序列化为结构化对象。
 * LongWritable类型:Hadoop.io对Long类型的封装类型
 */
public class UserMapper extends Mapper<LongWritable,Text,Text,UserEntity> {

    private UserEntity userEntity = new UserEntity();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //将每行的数据以空格切分数据，获得每个字段数据 1 135****9365 林*彬 2484 北京市昌平区北七家东三旗村
        String[] fields = value.toString().split("\t");
        //赋值userEntity
        userEntity.set(Integer.parseInt(fields[0]), fields[1], fields[2], Double.parseDouble(fields[3]), fields[4], 0.00);
        //System.out.println("key = "+key.get()+"**************"+Thread.currentThread().getId()+"******************map start*********************************");
        //System.out.println(userEntity.toString());
        //System.out.println("**************"+Thread.currentThread().getId()+"******************map end**********************************");
        // 将对象序列化
        context.write(new Text("userEntity"),userEntity);
    }

}
